<!--
 * @Description:
 * @Author: dh
 * @Date: 2021-09-15 10:32:03
 * @LastEditors: dh
 * @LastEditTime: 2021-09-16 15:59:44
-->
<!doctype html>
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<meta http-equiv="X-UA-Compatible" content="IE=edge" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
		<title>5、组合继承</title>
	</head>
	<!--
        核心：通过调用父类构造，继承父类的属性并保留传参的优点，然后通过将父类实例作为子类原型，实现函数复用  推荐

        特点：
            1.弥补了方式2的缺陷，可以继承实例属性/方法，也可以继承原型属性/方法
            2.既是子类的实例，也是父类的实例
            3.不存在引用属性共享问题
            4.可传参
            5.函数可复用
        缺点：
            1.调用了两次父类构造函数，生成了两份实例（子类实例将子类原型上的那份屏蔽了）

        推荐指数：★★★★（仅仅多消耗了一点内存）
 -->

	<body>
		<script>
			function Animal(name) {
				this.name = name || 'Animal';
				this.sleep = function () {
					console.log(this.name + '正在睡觉！');
				};
			}
			// 原型方法
			Animal.prototype.eat = function (food) {
				console.log(this.name + '正在吃：' + food);
			};

			function Cat(name = 'Tom') {
				Animal.call(this, name); // 继承实例属性
			}
			Cat.prototype = new Animal(); // 继承父类方法

			Cat.prototype.constructor = Cat; // 修改指针

			var cat = new Cat();
			console.log(cat.name);
			console.log(cat.sleep());
			console.log(cat instanceof Animal); // true
			console.log(cat instanceof Cat); // true
		</script>
	</body>
</html>
